package com.neusoft.tree;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.Objects;

/**
 * @author lichunlong lcl253137@alibaba-inc.com
 * @desc 二叉树节点类
 * @date 2024-06-11
 */
@Data
@ToString
@NoArgsConstructor
public class Node<E> {

    /**
     * 节点数据
     */
    E item;

    /**
     * 左子树节点
     */
    Node<E> subLeft;

    /**
     * 右子树节点
     */
    Node<E> subRight;

    public Node(E item) {
        this.item = item;
    }

    /**
     * 前序遍历: 根节点 -> 左子树 -> 右子树
     */
    public void preOrder() {
        // 先输出父结点
        System.out.println(this);
        // 递归向左子树前序遍历
        if (Objects.nonNull(subLeft)) {
            subLeft.preOrder();
        }
        // 递归向右子树前序遍历
        if (Objects.nonNull(subRight)) {
            subRight.preOrder();
        }
    }

    /**
     * 中序遍历: 左子树 -> 根节点 -> 右子树
     */
    public void midOrder() {
        // 递归向左子树中序遍历
        if (Objects.nonNull(subLeft)) {
            subLeft.midOrder();
        }
        // 输出父结点
        System.out.println(this);
        // 递归向右子树中序遍历
        if (Objects.nonNull(subRight)) {
            subRight.midOrder();
        }
    }

    /**
     * 后序遍历: 左子树 -> 右子树 -> 根节点
     */
    public void postOrder() {
        // 递归向左子树中序遍历
        if (Objects.nonNull(subLeft)) {
            subLeft.postOrder();
        }
        // 递归向右子树中序遍历
        if (Objects.nonNull(subRight)) {
            subRight.postOrder();
        }
        // 输出父结点
        System.out.println(this);
    }

}
